#include "spinlock.h"

// 初始化自旋锁函数
void initlock(spinlock_t *lock, char *name) {
    lock->locked = 0;
    lock->name = name;
}

// 获取自旋锁
void spin_lock(spinlock_t *lock) {
    // 使用原子操作尝试获取锁，避免多核竞争 [citation:8]
    while (__sync_lock_test_and_set(&lock->locked, 1) == 1) {
        // 锁被占用时，让CPU核心短暂休息（对于RISC-V，可使用wfi指令或直接循环）
        asm volatile("nop"); // 简单的空操作，避免过度消耗
    }
    // 内存屏障，确保临界区内的负载和存储不会越过此边界 [citation:5]
    __sync_synchronize();
}

// 尝试获取自旋锁
int spin_trylock(spinlock_t *lock) {
    // 原子性地尝试将锁设置为1，并返回旧值 [citation:4]
    if (__sync_lock_test_and_set(&lock->locked, 1) == 0) {
        __sync_synchronize(); // 获取成功，添加内存屏障
        return 0; // 成功
    }
    return 1; // 失败
}

// 释放自旋锁
void spin_unlock(spinlock_t *lock) {
    __sync_synchronize(); // 释放前的内存屏障
    // 原子性地释放锁 [citation:4]
    __sync_lock_release(&lock->locked);
}

// 为兼容性创建别名
void acquire(spinlock_t *lock) {
    spin_lock(lock);
}

void release(spinlock_t *lock) {
    spin_unlock(lock);
}